package com.chuangke.sinotrukbudget.service;

import java.util.List;
import java.util.Map;

import com.chuangke.flow.domain.FlowAuditResult;
import com.chuangke.framework.service.BatchOrderFlowService;
import com.chuangke.sinotrukbudget.model.BudgetBpcPlan;

/**
 * bpc预算上报 Service接口
 *
 * @author chuangke
 * @date "2022-10-21"
 */
public interface BudgetBpcPlanService extends BatchOrderFlowService {

    /**
     * @param category 预算版本
     * @param deptId   预算期间
     * @param bbpList
     */
    void save(String category, String deptId, String time, List<Map<String, Object>> bbpList);

    List<BudgetBpcPlan> findBudgetBpcPlanWithCache(String deptId, String category, String time);

    /**
     * 缓存失效方法，不具体操作，只做缓存失效
     *
     * @param deptId
     * @param category
     * @param time
     */
    void cacheEvict(String deptId, String category, String time);

    /**************************** 流程操作接口相关 *********************************/
    // 下面的接口是供前台提供服务的，继承BatchOrderService相关接口是流程驱动的

    /**
     * 流程启动并提交
     */
    int startFlowAndSubmit();

    void startFlowAndSubmit(String auditUser, List<BudgetBpcPlan> bbpList);

    /**
     * 流程启动
     */
    void startProcessInstance(List<BudgetBpcPlan> bbpList);

    /**
     * 预算提交
     *
     * @param auditStatus
     * @param tCategory
     * @param deptId
     * @return
     */
    FlowAuditResult submitBudget(String category, String time, String deptId, List<String> accountIds);

    /**
     * 预算自动提交，bpc推进来的数据，自动提交
     *
     * @param auditStatus
     * @param tCategory
     * @param deptId
     * @return
     */
    FlowAuditResult autoSubmitBudget(String auditUser, List<BudgetBpcPlan> list);

    /**
     * 预算审批
     *
     * @param audit：审批类型（同意；退回）
     * @param message审批意见
     * @param calType汇总方式
     * @param tCategory预算版本
     * @param deptIds单位ids
     * @param accountIds科目ids
     * @return
     */
    FlowAuditResult auditBudget(String audit, String message, String calType, String tCategory, String time,
                                List<String> deptIds, List<String> accountIds);

    /**
     * 预算撤回
     *
     * @param audit
     * @param message
     * @param calType
     * @param tCategory
     * @param deptIds
     * @param accountIds
     * @return
     */
    FlowAuditResult revokeBudget(String audit, String message, String calType, String tCategory, String time,
                                 List<String> deptIds, List<String> accountIds);

    /**************************** 预算查询接口相关 *********************************/

    /**
     * 根据组织机构查询预算数据 一个组织机构下面填报的预算信息
     *
     * @param auditStatus
     * @param tCategory
     * @param deptId
     * @return
     */
    Map<String, Object> listEditBudget(String auditStatus, String tCategory, String deptId, String time);

    /**
     * 根据组织机构和归口部门查询预算
     *
     * @param auditStatus
     * @param tCategory
     * @param deptId
     * @return
     */
    Map<String, Object> listGuiKouBudget(String tCategory, String deptId, String guiKouId, String time);

    /**
     * 预算汇总查询
     *
     * @param auditStatus
     * @param calType
     * @param tCategory
     * @param deptIds
     * @param accountIds
     * @return
     */
    Map<String, Object> listAuditBudget(boolean isControl, String auditStatus, String calType, String tCategory, String time,
                                        List<String> deptIds, List<String> accountIds, List<String> flowIds);

    /**
     * 汇总数据的穿透明细查询
     *
     * @param auditStatus
     * @param calType
     * @param tCategory
     * @param deptIds
     * @param accountIds
     * @return
     */
    Map<String, Object> listAuditDetailBudget(String auditStatus, String calType, String tCategory, String time,
                                              List<String> deptIds, List<String> accountIds, List<String> flowIds);

    /**
     * 加载预算流程id,用来查看流程
     *
     * @param auditStatus
     * @param calType
     * @param tCategory
     * @param deptIds
     * @param accountIds
     * @return
     */
    String getFlowId(String deptId, String category, String accountId, String time);

    /**
     * 获取审核完成并且未回写的预算数据
     *
     * @return
     */
    List<BudgetBpcPlan> findAuditedAndUnWriteBackBudget();

    /**
     * 接收BPC传过来的预算数据
     *
     * @param bbpList
     */
    void receiveBudgetData(List<BudgetBpcPlan> bbpList);

    /**
     * 根据唯一索引查询数据
     *
     * @param params
     * @return
     */
    List<BudgetBpcPlan> findBudgetBpcPlanByUniqueIndex(Map<String, Object> params);
    
    /**
	 * 处理处理时间
	 */
    void handleHandleTime() ;

}
